#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
IR 注释节点定义
"""

from dataclasses import dataclass, field
from typing import List, Optional
from ..base import IRNode
from ..declarations.annotation import IRAnnotation, Parameters
import re

annotation_pattern1 = re.compile(r"@(mcpy_\w+):\s*(.+)")
annotation_pattern2 = re.compile(r"#\s+@(mcpy_\w+):\s*(.+)")


@dataclass
class CommentLine:
    """单行注释信息"""

    line_number: int
    content: str  # 注释内容

    def is_annotation(self) -> bool:
        """是否为注解注释"""
        return self.content.startswith("# @") or self.content.startswith("@")


@dataclass
class IRComment(IRNode):
    """IR 注释节点"""

    node_type: str = "comment"
    lines: List[CommentLine] = field(default_factory=list)  # 注释行列表

    @property
    def content(self) -> str:
        """获取合并的注释内容"""
        return "\n".join(line.content for line in self.lines)

    def add_comment_line(self, line: CommentLine):
        """添加注释行"""

        self.lines.append(line)
        if not self.source_line:
            self.source_line = line.line_number

    def __str__(self):
        return self.content

    def process_annotations(self):
        """处理注解"""
        if not self.parent:
            return

        for line in self.lines:
            if not line.is_annotation():
                continue

            annotation = self._create_annotation(line)
            if annotation:
                self.parent.annotations.append(annotation)

    def _create_annotation(self, line: CommentLine) -> Optional[IRAnnotation]:
        """从注释行创建注解"""

        # 去掉注释前缀，提取注解内容
        content = line.content
        if content.startswith("# @"):
            annotation_pattern = annotation_pattern2
        else:
            annotation_pattern = annotation_pattern1

        # 解析注解内容
        match = annotation_pattern.match(content)
        if not match:
            return None

        annotation_name = match.group(1)
        parameter_string = match.group(2).strip()
        parameters = self._parse_annotation_parameters(parameter_string)
        return IRAnnotation(
            parent=self.parent,
            source_line=line.line_number,
            annotation_name=annotation_name,
            parameters=parameters,
        )

    def _parse_annotation_parameters(self, parameter_string: str) -> Parameters:
        """解析注解参数：支持多值参数的 key=value, key=value 格式

        支持：
        - key=value 格式的键值对
        - 同一个 key 可以配置多次：key=value1, key=value2
        - 单独的标志（没有等号的项作为布尔值 True）
        - 逗号分隔的多个参数

        返回：Parameters - 每个 key 对应一个值列表
        """
        parameters = Parameters()
        items = [item.strip() for item in parameter_string.split(",")]
        for item in items:
            if "=" in item:
                key, value = item.split("=", 1)
                key = key.strip()
                value = value.strip()
                parameters.add(key, value)
            else:
                # 没有等号的项作为标志
                key = item.strip()
                parameters.add(key, True)

        return parameters
